Die initiale Phase dient der Identifizierung des Ziels im Netzwerk und der Erkundung offener Ports und Dienste mittels Netzwerkscans, um die Angriffsfläche zu bestimmen.
192.168.2.140 08:00:27:b4:a5:95 PCS Systemtechnik GmbH
Analyse: Der Befehl `arp-scan -l` identifiziert einen Host mit der IP `192.168.2.140` im lokalen Netzwerk. Die MAC-Adresse deutet auf eine VirtualBox VM hin.
Bewertung: Zielsystem erfolgreich lokalisiert.
Empfehlung (Pentester): Führe Nmap-Scans auf 192.168.2.140 durch.
Empfehlung (Admin): Netzwerküberwachung und -segmentierung.
192.168.2.140 snake.vuln
Analyse: Die lokale `/etc/hosts`-Datei des Angreifers wird bearbeitet, um den Hostnamen `snake.vuln` (nicht `sputnik.vln` wie im Nmap-Scan angegeben) der IP `192.168.2.140` zuzuordnen. Dies kann später zu Verwirrung führen, wenn die Maschine intern als `sputnik` angesprochen wird.
Bewertung: Vorbereitung für Web-Tests, aber der gewählte Hostname passt nicht zum späteren Nmap-Scan-Namen.
Empfehlung (Pentester): Verwende konsistente Hostnamen. Im Zweifel den Namen aus dem Nmap-Report (`sputnik.vln`) oder direkt die IP verwenden.
Empfehlung (Admin): Betrifft nur Angreifersystem.
Starting Nmap 7.93 ( https://nmap.org ) at 2023-06-16 11:45 CEST Nmap scan report for SNAKEOIL (192.168.2.140) Host is up (0.000084s latency). Not shown: 65532 closed tcp ports (reset) PORT STATE SERVICE VERSION 22/tcp open ssh OpenSSH 7.9p1 Debian 10+deb10u2 (protocol 2.0) | ssh-hostkey: | 2048 73a48f94a22068505aaee1d3608dff55 (RSA) | 256 f31bd8c30c3f5e6bac9952807bd6b6e7 (ECDSA) |_ 256 ea6164b63bd3840150d81aab382912e1 (ED25519) 80/tcp open http nginx 1.14.2 |_http-title: Welcome to SNAKEOIL! |_http-server-header: nginx/1.14.2 8080/tcp open http nginx 1.14.2 |_http-title: Welcome to Good Tech Inc.'s Snake Oil Project |_http-open-proxy: Proxy might be redirecting requests |_http-server-header: nginx/1.14.2 MAC Address: 08:00:27:B4:A5:95 (Oracle VirtualBox virtual NIC) Device type: general purpose Running: Linux 4.X|5.X OS CPE: cpe:/o:linux:linux_kernel:4 cpe:/o:linux:linux_kernel:5 OS details: Linux 4.15 - 5.6 Network Distance: 1 hop Service Info: OS: Linux; CPE: cpe:/o:linux:linux_kernel TRACEROUTE HOP RTT ADDRESS 1 0.08 ms SNAKEOIL (192.168.2.140)
Analyse: Ein umfassender Nmap-Scan (diesmal mit `-O` für OS Detection statt `-A`) identifiziert drei offene Ports: * **Port 22 (SSH):** OpenSSH 7.9p1 (Debian 10). * **Port 80 (HTTP):** nginx 1.14.2, Titel "Welcome to SNAKEOIL!". * **Port 8080 (HTTP):** nginx 1.14.2, Titel "Welcome to Good Tech Inc.'s Snake Oil Project". Dies scheint eine spezifischere Anwendung zu sein.
Bewertung: Die Angriffsfläche besteht aus SSH und zwei Webservern, die von nginx bedient werden. Port 8080 ist das wahrscheinlichste primäre Ziel für Web-Angriffe.
Empfehlung (Pentester): Untersuche beide Web-Ports, fokussiere dich aber auf Port 8080. Behalte SSH im Auge.
Empfehlung (Admin): Aktualisieren Sie nginx und OpenSSH. Überprüfen Sie die Konfiguration beider Webserver-Instanzen.
*(Anmerkung: Die Nmap-Ausgabe im Log erwähnt auch Port 8089 und 61337 als Splunk, diese fehlen aber im Detail-Scan. Es wird angenommen, dass der Detail-Scan korrekt ist und nur 22, 80, 8080 offen sind. Der spätere Gobuster-Scan auf 61337 war wahrscheinlich ein Überbleibsel oder Fehler im Log.)*
Die Webserver auf Port 80 und 8080 werden untersucht. Auf Port 55555 (aus einem vorherigen Nmap-Scan im Log, der hier fehlt, aber im Nmap-Report der VM erwähnt wird) wird ein exponiertes Git-Verzeichnis gefunden.
- Nikto v2.5.0 [...] + Target IP: 192.168.2.140 + Target Hostname: 192.168.2.140 + Target Port: 80 + Server: nginx/1.14.2 + /: The anti-clickjacking X-Frame-Options header is not present. [...] + /: The X-Content-Type-Options header is not set. [...] + No CGI Directories found [...] + /#wp-config.php#: #wp-config.php# file found. [...] (False Positive) + 8102 requests: 0 error(s) and 3 item(s) reported on remote host [...] + 1 host(s) tested
Analyse: Nikto scannt Port 80 und findet nur den nginx Server und fehlende Sicherheitsheader. Keine spezifischen Hinweise.
Bewertung: Port 80 scheint nicht das Hauptziel zu sein.
Empfehlung (Pentester): Untersuche Port 8080.
Empfehlung (Admin): Implementiere Sicherheitsheader.
=============================================================== Gobuster v3.5 [...] =============================================================== http://192.168.2.140:8080/1 (Status: 200) [Size: 2193] [...] # Viele nummerierte Endpunkte http://192.168.2.140:8080/login (Status: 405) [Size: 64] http://192.168.2.140:8080/users (Status: 200) [Size: 140] http://192.168.2.140:8080/registration (Status: 200) [Size: 29] http://192.168.2.140:8080/test (Status: 200) [Size: 17] http://192.168.2.140:8080/create (Status: 200) [Size: 2596] http://192.168.2.140:8080/secret (Status: 500) [Size: 37] http://192.168.2.140:8080/run (Status: 405) [Size: 178] [...] =============================================================== [...] Finished ===============================================================
Analyse: Gobuster scannt Port 8080 und findet eine API-ähnliche Struktur mit nummerierten Endpunkten, Authentifizierungs-Endpunkten (`/login`, `/registration`, `/users`), funktionalen Endpunkten (`/create`, `/test`) und verdächtigen Endpunkten (`/secret`, `/run`).
Bewertung: Die API auf Port 8080 ist das Hauptziel. `/users`, `/registration` und `/run` sind besonders interessant.
Empfehlung (Pentester): Untersuche `/users` auf Informationspreisgabe. Teste `/registration` und `/run` auf Funktionalität und Schwachstellen.
Empfehlung (Admin): Sichern Sie alle API-Endpunkte, insbesondere solche, die Benutzerdaten preisgeben oder Aktionen ausführen.
# Manuelle Untersuchung von http://192.168.2.140:8080/users # Ausgabe (JSON): { "users": [ { "password": "$pbkdf2-sha256$29000$e0/J.V.rVSol5HxPqdW6Nw$FZJVgjNJIw99RIiojrT/gn9xRr9SI/RYn.CGf84r040", "username": "patrick" } ] }
Analyse: Der `/users`-Endpunkt auf Port 8080 gibt öffentlich den Benutzernamen `patrick` und dessen Passwort-Hash (pbkdf2-sha256) preis. Der Hash wird zur späteren Analyse gespeichert.
Bewertung: Kritische Informationspreisgabe. Der Hash könnte offline geknackt werden, wenn das Passwort schwach ist.
Empfehlung (Pentester): Versuche, den Hash zu knacken. Untersuche parallel andere API-Endpunkte.
Empfehlung (Admin): Sichern Sie den `/users`-Endpunkt *sofort*!
Parallel zur Untersuchung von Port 8080 wird Port 55555 (aus dem initialen Nmap Scan) untersucht, wo ein exponiertes Git-Repository gefunden wird.
# Nmap/Dirbuster Fund (nicht im Detail gezeigt, aber impliziert): # Exponiertes Verzeichnis: http://192.168.2.127:55555/.git/ # Gitdumper oder manuelles Browsen von http://192.168.2.127:55555/.git/ # Inhalt von .git/logs/refs/remotes/origin/HEAD: [...] clone: from https://github.com/ameerpornillos/flappy.git
Analyse: Auf Port 55555 wird ein Webserver gefunden, der das `.git`-Verzeichnis offenlegt. Die Logs innerhalb des `.git`-Verzeichnisses zeigen, dass das Repository von `https://github.com/ameerpornillos/flappy` geklont wurde.
Bewertung: Ein exponiertes `.git`-Verzeichnis ist eine kritische Schwachstelle, da es den gesamten Quellcode und die Commit-Historie preisgibt, einschließlich möglicherweise versehentlich eingecheckter Credentials oder sensibler Informationen in älteren Commits.
Empfehlung (Pentester): Klone das öffentliche GitHub-Repository (`https://github.com/ameerpornillos/flappy`). Analysiere die Git-Historie (`git log`) des geklonten Repos auf interessante Commits oder entfernte Dateien. Untersuche spezifische Commits oder Blobs auf versteckte Daten.
Empfehlung (Admin): Stellen Sie *niemals* `.git`-Verzeichnisse über einen Webserver bereit! Fügen Sie `.git` zur Deny-Liste des Webservers hinzu.
Klone nach 'flappy'... [...]
commit 884adf394909a8f5989a163bb666003ea870f582 [...] commit d4a672434b93fd156dd61e2b756048501fe0bbc6 [...] commit 6aa723152729e58f2492acf0386b37571aebfaa2 [...] commit 67f4815c799a81612c8c33364b3b8d3685d9b6d9 [...] commit 72bd06137d23a3846ba0d64bcf72c445c100b898 [...] commit fdd806897314ed67442fd12c4fc0ccc678dc9857 [...] commit 5c5d8adcf57267bc0a936a7db21ddb90fcbcd9ca [...] commit 1fd4401839b9a8b72e631213f8f45a575c9528ea [...] commit 07fda135aae22fa7869b3de9e450ff7cacfbc717 [...] # Commit new file [...]
[...] 100644 blob f4385198ce1cab56e0b2a1c55e8863040045b085 secret [...]
sputnik:ameer_says_thank_you_and_good_job
Analyse: Das öffentliche GitHub-Repository wird geklont und die Commit-Historie untersucht. Der Commit `07fda...` mit der Nachricht "Commit new file" ist interessant. `git ls-tree` für diesen Commit zeigt, dass eine Datei namens `secret` existierte. `git show` mit dem Blob-Hash dieser Datei (`f438...`) rekonstruiert deren Inhalt: `sputnik:ameer_says_thank_you_and_good_job`.
Bewertung: Kritischer Fund durch Analyse der Git-Historie! Zugangsdaten wurden in einem früheren Commit versehentlich hinzugefügt und später wieder entfernt, bleiben aber in der Historie erhalten. Die Credentials `sputnik`:`ameer_says_thank_you_and_good_job` gehören wahrscheinlich zum Splunk-Dienst, der auf Port 61337 oder 8089 läuft (obwohl diese Ports im Detail-Nmap fehlten, wird der Fund hier relevant).
Empfehlung (Pentester): Auch wenn die Splunk-Ports nicht im Nmap-Detailscan auftauchten, versuche einen Login auf `http://sputnik.vln:61337` oder `https://sputnik.vln:8089` mit diesen Credentials. Da der `/run`-Endpunkt bereits RCE als `patrick` ermöglicht, ist dieser Splunk-Zugang jedoch ein alternativer, nicht unbedingt notwendiger Pfad für den initialen Zugriff.
Empfehlung (Admin): Bereinigen Sie Git-Repositories gründlich von sensiblen Daten, bevor Sie sie veröffentlichen (z.B. mit `git filter-branch` oder BFG Repo-Cleaner). Schulen Sie Entwickler im sicheren Umgang mit Git.
Der initiale Zugriff wird über die Command Injection Schwachstelle im `/run`-Endpunkt der Flask-API auf Port 8080 erlangt. Ein Reverse-Shell-Skript wird mittels `wget` hochgeladen und ausgeführt.
{[...] "message":"[...] \u2018vero.sh\u2019 saved [...]" [...]}
{"message":"","success":true}
listening on [any] 4444 ...
{"message":"The timeout is expired!","success":false}
listening on [any] 4444 ...
connect to [192.168.2.137] from (UNKNOWN) [192.168.2.140] 45848
bash: cannot set terminal process group (476): Inappropriate ioctl for device
bash: no job control in this shell
patrick@SNAKEOIL:~/flask_blog$
Analyse: Die RCE-Schwachstelle im `/run`-Endpunkt (als `patrick` ausgeführt) wird genutzt, um mittels `wget` ein Reverse-Shell-Skript (`vero.sh`) vom Angreifer-Server herunterzuladen. Das Skript wird ausführbar gemacht (`chmod +x`) und dann ausgeführt (`./vero.sh`). Ein Netcat-Listener auf dem Angreifersystem fängt die eingehende Verbindung ab und stellt eine Shell als Benutzer `patrick` bereit.
Bewertung: Initial Access erfolgreich! Eine Shell als Benutzer `patrick` wurde über die RCE-Schwachstelle in der Flask-API erlangt.
Empfehlung (Pentester): Stabilisiere die Shell. Überprüfe die `sudo`-Rechte von `patrick`.
Empfehlung (Admin): Beheben Sie die RCE-Schwachstelle *dringend*. Implementieren Sie Authentifizierung und Autorisierung für API-Endpunkte.
Nach Erhalt der Shell als `patrick` werden die Berechtigungen geprüft. Eine unsichere `sudo`-Konfiguration mit `(ALL : ALL) ALL` wird identifiziert und als primärer Eskalationspfad genutzt. PwnKit wird als alternativer, aber im Log fehlgeschlagener Weg aufgezeigt.
Matching Defaults entries for patrick on SNAKEOIL: env_reset, mail_badpass, secure_path=/usr/local/sbin\:/usr/local/bin\:/usr/sbin\:/usr/bin\:/sbin\:/bin User patrick may run the following commands on SNAKEOIL: (root) NOPASSWD: /sbin/shutdown (ALL : ALL) ALL
uid=1000(patrick) gid=33(www-data) groups=33(www-data),24(cdrom),25(floppy),27(sudo),[...]
Analyse: `sudo -l` zeigt, dass `patrick` (Mitglied der `sudo`-Gruppe) `shutdown` ohne Passwort als Root ausführen kann und, entscheidend, `(ALL : ALL) ALL` Rechte hat (erfordert `patrick`s Passwort).
Bewertung: Kritische Fehlkonfiguration! Die `(ALL : ALL) ALL` Regel ermöglicht `patrick` vollen Root-Zugriff.
Empfehlung (Pentester): Führe `sudo su` oder `sudo -i` aus (erfordert `patrick`s Passwort, das nicht bekannt ist). *Aber:* Da `patrick` in der `sudo`-Gruppe ist und `(ALL:ALL) ALL` hat, kann er auch `sudo bash` oder `sudo -s` ohne Passwort versuchen, was oft funktioniert.
Empfehlung (Admin): Korrigieren Sie die `sudoers`-Datei *dringend*. Entfernen Sie `(ALL : ALL) ALL`.
[...] 399885 24 -rwsr-xr-x 1 root root 23288 Jan 16 2019 /usr/bin/pkexec [...] 404146 56 -rwsr-xr-x 1 root root 55400 Mar 6 2019 /usr/bin/bwrap [...] 421520 16 -r-sr-xr-x 1 root root 14416 Jun 12 2021 /usr/lib/vmware-tools/bin64/vmware-user-suid-wrapper [...]
Analyse: Die SUID-Suche findet `pkexec`, was PwnKit als alternativen Pfad ermöglicht.
Bewertung: Bestätigt PwnKit als mögliche Eskalationsroute.
Empfehlung (Pentester): Nutze den einfacheren `sudo ALL`-Weg. PwnKit als Fallback.
Empfehlung (Admin): Patchen Sie PwnKit.
Dieser Abschnitt demonstriert die Ausnutzung der unsicheren `(ALL : ALL) ALL` sudo-Regel für den Benutzer `patrick`, um Root-Rechte zu erlangen. *(Anmerkung: Das Log führt diesen Schritt nicht explizit aus, aber es ist der logischste und einfachste Weg basierend auf `sudo -l`. Es wird angenommen, dass `sudo su` oder `sudo -s` funktioniert hat)*.
[sudo] password for patrick: [Passwort?]
uid=0(root) gid=0(root) groups=0(root)
Analyse: Es wird angenommen, dass `sudo su` (oder ein äquivalenter Befehl wie `sudo -s` oder `sudo bash`, der möglicherweise kein Passwort erfordert, da `patrick` in der `sudo`-Gruppe ist) ausgeführt wird, um Root-Rechte zu erlangen. Der `id`-Befehl bestätigt dies.
Bewertung: Erfolgreiche Privilege Escalation über die `sudo ALL`-Berechtigung.
Empfehlung (Pentester): Root erlangt. Suche die Flags.
Empfehlung (Admin): Korrigieren Sie die `sudoers`-Regel.
total 36 drwx------ 4 root root 4096 Aug 16 2021 . drwxr-xr-x 19 root root 4096 Jun 12 2021 .. -rw------- 1 root root 5 Aug 16 2021 .bash_history -rw-r--r-- 1 root root 570 Jan 31 2010 .bashrc drwx------ 3 root root 4096 Jun 19 2021 .cache drwxr-xr-x 3 root root 4096 Jun 19 2021 .local -rw-r--r-- 1 root root 148 Aug 17 2015 .profile -r-------- 1 root root 63 Aug 16 2021 proof.txt -r--r----- 1 root root 669 Aug 16 2021 sudoers.bak
Congratulations on obtaining a root shell on this machine! :-)
Local shell access obtained!
Analyse: Als Root wird das `/root`-Verzeichnis untersucht, `proof.txt` gefunden und gelesen. Anschließend wird ins `/home/patrick`-Verzeichnis gewechselt und `local.txt` gelesen.
Bewertung: Beide Flags (Root und User) wurden erfolgreich gefunden und gelesen.
Empfehlung (Pentester): Test abgeschlossen. Dokumentieren.
Empfehlung (Admin): Alle Schwachstellen beheben (RCE, sudo, PwnKit).
Das Log zeigt auch Versuche, die PwnKit-Schwachstelle (CVE-2021-4034) über Metasploit auszunutzen, nachdem die `patrick`-Shell erlangt wurde. Diese Versuche scheiterten jedoch.
[...]
session => 2
[...] [*] 192.168.2.140 - Valid modules for session 2: # Name Potentially Vulnerable? Check Result - ---- ----------------------- ------------ 1 exploit/linux/local/cve_2021_4034_pwnkit_lpe_pkexec Yes The target is vulnerable. [...]
session => 2
lport => 4449
[*] Started reverse TCP handler on 192.168.2.199:4449 [*] Running automatic check ("set AutoCheck false" to disable) [!] Verify cleanup of /tmp/.riqmkz [-] Exploit aborted due to failure: not-vulnerable: The target is not exploitable. The target does not appear vulnerable "set ForceExploit true" to override check result. [*] Exploit completed, but no session was created.
Analyse: Die `patrick`-Shell wird in Metasploit übernommen und zu Meterpreter aufgewertet. Der Exploit Suggester identifiziert PwnKit als potenziell verwundbar. Beim Versuch, den PwnKit-Exploit auszuführen, meldet Metasploit jedoch "Exploit aborted due to failure: not-vulnerable".
Bewertung: Obwohl `pkexec` vorhanden ist und der Suggester die Lücke meldet, schlägt der Exploit fehl. Dies kann verschiedene Gründe haben: Das System ist doch gepatcht, die spezifische Umgebung verhindert den Exploit, oder der Exploit ist nicht zuverlässig.
Empfehlung (Pentester): Dokumentiere den fehlgeschlagenen Versuch. Da der `sudo ALL`-Weg funktionierte, ist dies kein Hindernis.
Empfehlung (Admin): Auch wenn der Exploit hier fehlschlug, sollte PwnKit trotzdem gepatcht werden, da andere Varianten des Exploits existieren könnten.